#include <iostream>
#include "Reactor.hpp"
#include "Accepter.hpp"
#include "Util.hpp"

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: \n\t" << argv[0] << " port" << std::endl;
        exit(1);
    }
    // 1. 建立tcp 监听socket
    uint16_t port = (uint16_t)atoi(argv[1]);
    int listen_sock = Sock::Socket();
    Sock::Bind(listen_sock, port);
    Sock::Listen(listen_sock);

    // 2. 创建Reactor对象
    // Reactor 反应堆模式: 通过多路转接方案，被动的采用事件派发的方式，去反向的调用对应的回调函数
    Reactor *R = new Reactor;
    R->InitReactor();

    // 3. 给Reactor反应堆中添加 等待文件
    //设置成非阻塞，因为ET下我们要循环读
    //如果阻塞，底层没有链接会阻塞住，accept不返回
    SetNonBlock(listen_sock);
    Event *listen_ev = new Event;
    listen_ev->sock = listen_sock;
    listen_ev->R = R;
    // Accepter: 链接管理器
    listen_ev->RegisterCallback(Accepter, nullptr, nullptr);

    //将 封装好的文件信息 放入Reactor里
    R->InsertEvent(listen_ev, EPOLLIN | EPOLLET);
    for (;;)
    {
        R->Dispatcher(1000); //等待并派发事件
    }
}